\section*{Aufgabe 5}
\label{ch:testchap}

\subsection*{Aufgabenstellung}
Erweitern Sie Ihr semantisches XML-Vokabular für die Mediathek um optionale Container-Elemente für Alben und Werke. Analysieren Sie die Daten in der Mediathek dahingehend, wie Sie Alben und Werke automatisch erkennen können. Implementieren Sie ein entsprechendes Verfahren.

\subsection*{Lösungsansatz}
In dieser Aufgabe wird XSLT eingesetzt, da es sich um eine reine Transformation handelt. Im Listing zu Rohdaten Mediathek ist die Struktur der Datenbasis für diese Aufgabe dargelegt. Die Struktur der neuen Container-Elemente sollte dieselbe sein wie die des Playlists Containers um die Mediathek konsistent zu halten. Das bedeuted, dass zwischen TrackArea und Playlists zwei neue Container-Elemente mit den Namen Albums und Compilations eingeführt werden. Im folgenden wird die Gliederung der Compilations-Sektion vorgestellt.\\
\begin{lstlisting}[caption={Repräsentation der Compilations in der neuen Datenbasis}]
<Compilations>
	<Compilation>
		<CompilationName>Name</CompilationName>
		<CompilationUUID>UUID</CompilationUUID>
		<CompilationItems>
			<TrackIDRef>TrackID</TrackIDRef>
			...
		 </CompilationItems>
	</Compilation>
	...
</Compilations>
\end{lstlisting}
Im folgenden wird die Gliederung der Alben-Sektion vorgestellt.\\
\begin{lstlisting}[caption={Repräsentation der Alben in der neuen Datenbasis}]
<Albums>
	<Album>
		<AlbumName>Name</CompilationName>
		<AlbumUUID>UUID</CompilationUUID>
		<AlbumItems>
			<TrackIDRef>TrackID</TrackIDRef>
			...
		 </AlbumItems>
	</Album>
	...
</Albums>
\end{lstlisting}

\subsection*{Lösung}
Die Transformation muss in zwei Schritten erfolgen. Zuerst müssen die Album- und Compilation-Daten in der Mediathek gesucht werden und in die neuen Sektionen geschrieben werden. Im zweiten Schritt wird die generierte UUID zu jedem Album/Compilation in den jeweiligen Track eingefügt. Damit hat man zwar eine doppelte Verlinkung, allerdings gewinnt man dadurch Geschwindigkeit bei Abfragen, was besonders bei der Zusatzaufgabe ins Gewicht fällt. Folgende Abbildung legt den Ablauf dar.
\begin{figure}[htbp]
	\begin{center}
		\includegraphics[width=\textwidth]{a5_ablauf}
		\caption{Ablaufschema}
	\end{center}	
\end{figure}


\lstinputlisting[caption=Erstelle Compilations- bzw. Alben Sektion, firstnumber=21, linerange=21-47]{../Aufgabe5/Aufgabe5_generate_compilations_albums.xslt}
Die beiden Code-Fragmente, welche die Alben- bzw. Compilations-Sektion erstellen sind ziemlich ähnlich, weshalb sie in einem abgehandelt werden. Alle übrigen Sektionen werden in die neue Mediathek einfach übernommen. In Zeile 22 bzw. 36 geschieht die Erkennung einer Compilation bzw eines Albums. Falls ein Tag mit dem Namen Album existiert handelt es sich um eines der beiden. Existiert zusätzlich noch ein Tag mit dem Namen Compilation und ist dieses auf true gesetzt handelt es sich um eine Compilation, andernfalls um ein Album. Ein Merkmal viel dabei auf: ein Album scheint immer nur von einer KomponistIn zu sein, während eine Compilation Tracks mehrerer KomponistInnen beinhalten kann. \texttt{for-each-group} gruppiert die Tracks nach dem Album-/Compilation-Namen und generiert zu jedem Album/Compilation eine eindeutige UUID. Diese wird in das Tag AlbumUUID und CompilationUUID geschrieben. Dabei haben wir uns bewusst für ein Tag und nicht ein Attribut entschieden um konsistent mit den bereits vorhandenen Daten zu bleiben (siehe Playlists, TrackArea). Nach diesen Metainformationen gibt es eine AlbumItems- bzw CompilationItems-Sektion, in welcher sämtliche IDs von zugehörigen Tracks abgelegt werden.\\
\\
Folgendes Listing gehört zum zweiten Schritt:\\
\lstinputlisting[caption=Füge Album- bzw. Compilation-UUID zu zugehörigen Tracks hinzu, firstnumber=20, linerange=20-43]{../Aufgabe5/Aufgabe5_tracks_finalize.xslt}
In Zeile 25 bzw. 31 wird wiederum mit demselben Verfahren entschieden ob der jeweilige Track zu einer Compilation bzw. zu einem Album gehört. Je nachdem wird nun die richtige UUID in das Tag AlbumUUID bzw. CompilationUUID geschrieben und zum Track hinzugefügt. Alle anderen Track-Informationen werden kopiert.
